import Vue from 'vue'

import Cookies from 'js-cookie'

import Element from 'element-ui'
import './styles/element-variables.scss'
import '@/styles/index.scss' // global css
import '@/styles/mediaStyle.scss' // global css

import {
  UTableColumn,
  UTable,
  UxGrid,
  UxTableColumn
} from 'umy-ui'

Vue.use(UTableColumn)
Vue.use(UTable)
Vue.use(UxGrid)
Vue.use(UxTableColumn)

import App from './App'
import store from './store'// vuex
import router from './router'// 路由

import directive from './directive' // directive

import './icons' // icon
import './permission' // permission control

import * as filters from './filters' // global filters

import websocket from 'vue-native-websocket' // websocket

import i18n from './lang' // 国际化

import layer from './components/customizedComponents/vue-layer/packages/layer/index' // 弹框
import './components/customizedComponents/vue-layer/lib/vue-layer.css'

// import echarts from 'echarts' // 引入echarts
import * as echarts from 'echarts/dist/echarts.esm'
Vue.prototype.$echarts = echarts

// 引入moment
import moment from 'moment'
import 'moment/locale/zh-cn'

// 自动注册 JLink 目录下的组件
import './components/JLink/autoImport'

// 分辨率适配  todo 分辨率适配
// import './utils/rem'
// import './utils/flexible'

import settings from '@/utils/index'
Vue.prototype.SETTINGS = settings.settings // 注册全局变量（系统设置）

// 表格滚动加载
import InfiniteLoading from 'vue-infinite-loading'
Vue.use(InfiniteLoading, {
  props: {
    spinner: 'waveDots'
  },
  slots: {
    noResults: '无数据...',
    noMore: '没有更多了...'
    // noResults: ''
    // noMore: ''
  }
})
import { sortChange, rowClick, selectionChange, setSelectRow, setSecondPageSetting, getSecondPageSetting } from '@/utils/table' // 表格通用方法
Vue.prototype.sortChange = sortChange // 排序规则改变时触发
Vue.prototype.rowClick = rowClick // 单击行触发
Vue.prototype.selectionChange = selectionChange // 选择框改变时触发
Vue.prototype.setSelectRow = setSelectRow // 加载表格数据时，设置之前选中的行为选中状态
Vue.prototype.setSecondPageSetting = setSecondPageSetting // 设置：二级页面里的页面设置（如：新增/编辑页弹框里的表格字段设置）
Vue.prototype.getSecondPageSetting = getSecondPageSetting // 获取：二级页面里的页面设置（如：新增/编辑页弹框里的表格字段设置）
import { ExportExcel } from '@/excel/exportExcel'
Vue.prototype.ExportExcel = ExportExcel
// 使用中文时间
moment.locale('zh-cn')
Vue.prototype.$moment = moment

Vue.use(Element, {
  size: Cookies.get('size') || 'medium', // set element-ui default size
  i18n: (key, value) => i18n.t(key, value)
})

Vue.use(websocket, 'ws://xx.xx.xx:xx', {// 定义一个 websocket服务器地址 不会连接 后面会用新地址覆盖
  connectManually: true// 不自动连接
})

// register global utility filters
Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key])
})

Vue.config.productionTip = false

const auth = value => {
  let auth
  if (typeof value === 'string') {
    auth = store.getters['permission/hasAuthorizations'](value)
  } else {
    auth = value.some(item => {
      return store.getters['permission/hasAuthorizations'](item)
    })
  }
  return auth
}
// 注册 v-auth 指令
Vue.directive('auth', {
  inserted: (el, binding) => {
    if (!auth(binding.value)) {
      el.remove()
    }
  }
})

// 挂载 this.$auth() 方法
Vue.prototype.$auth = auth

// 挂载this.$layer()方法
Vue.prototype.$layer = layer(Vue)

// 引入深拷贝方法
import { deepClone, refreshTag, showTopCommonNotice } from '@/utils'
// 挂载深拷贝方法 this.$deepClone
Vue.prototype.$deepClone = deepClone
Vue.prototype.$refreshTag = refreshTag
Vue.prototype.$showTopCommonNotice = showTopCommonNotice
// 引入svg组件
import IconSvg from '@/components/SvgIcon'
// 全局注册icon-svg
Vue.component('IconSvg', IconSvg)

// 引入组件
import StepBar from '@/components/Common/StepBar'
// 全局注册组件
Vue.component('StepBar', StepBar)

// 引入组件
import Breadcrumb from '@/components/Breadcrumb'
// 全局注册组件
Vue.component('Breadcrumb', Breadcrumb)

// 图片预览
import hevueImgPreview from 'hevue-img-preview'
Vue.use(hevueImgPreview, {
  keyboard: true,
  clickMaskCLose: true,
  mainBackground: 'rgba(0,0,0,.4)'
})

// 防抖函数方法 只执行最后一次触发
// 使用方法:   this.$Debounce('方法','时间')()
let timer
Vue.prototype.$Debounce = function(fn, delay) {
  const delays = delay || 500
  return () => {
    const args = arguments
    const that = this
    clearTimeout(timer)
    timer = setTimeout(function() {
      fn.apply(that, args)
    }, delays)
  }
}

Vue.use(directive)

// eslint-disable-next-line no-new
new Vue({
  el: '#app',
  router,
  store,
  i18n,
  render: h => h(App)
})
